package net.xxcxcxcx.xc_enhancedmob.render;

import com.mojang.blaze3d.systems.RenderSystem;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.gui.DrawableHelper;
import net.minecraft.client.render.BufferBuilder;
import net.minecraft.client.render.BufferRenderer;
import net.minecraft.client.render.Tessellator;
import net.minecraft.client.render.VertexFormats;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.math.Matrix4f;

/**
 * hud元素渲染工具类
 * <p>主要用来处理所有的渲染
 * <p>提供一些静态的接口用来快速渲染
 */
@Environment(value = EnvType.CLIENT)
public abstract class HudRendererHelper extends DrawableHelper {
    /**
     * 通过element获得图片并渲染在屏幕的(x,y,z)位置
     * <p>注意(x,y,z)为图片左上端点的位置,z为0
     * <p>渲染长度为element.width
     * <p>渲染宽度为element.height
     *
     * @param matrices 用于渲染的矩阵堆栈
     * @param element  用于渲染的图片和图片相对位置信息
     * @param x        屏幕坐标x
     * @param y        屏幕坐标y
     */
    public static void drawTexture(MatrixStack matrices, TextureElement element, float x, float y) {
        drawTexture(matrices, element, x, y, 1, 1);
    }

    /**
     * 通过element获得图片并渲染在屏幕的(x,y,z)位置
     * <p>注意(x,y,z)为图片左上端点的位置,z为0
     * <p>渲染长度为element.width * widthPercentage
     * <p>渲染宽度为element.height * heightPercentage
     *
     * @param matrices         用于渲染的矩阵堆栈
     * @param element          用于渲染的图片和图片相对位置信息
     * @param widthPercentage  图片水平渲染百分比
     * @param heightPercentage 图片垂直渲染百分比
     * @param x                屏幕坐标x
     * @param y                屏幕坐标y
     */
    public static void drawTexture(MatrixStack matrices, TextureElement element, float x, float y, float widthPercentage, float heightPercentage) {
        drawTexture(matrices, element, x, y, element.getWidth() * widthPercentage, element.getHeight() * heightPercentage, widthPercentage, heightPercentage);
    }

    /**
     * 通过element获得图片并渲染在屏幕的(x0,y0,z)到(x1,y1,z)位置
     * <p>注意(x0,y0,z)为图片左上端点的位置,(x1,y1,z)为图片右下端点的位置,z为0
     * <p>渲染长度为width
     * <p>渲染宽度为height
     *
     * @param matrices         用于渲染的矩阵堆栈
     * @param element          用于渲染的图片和图片相对位置信息
     * @param widthPercentage  图片水平渲染百分比
     * @param heightPercentage 图片垂直渲染百分比
     * @param x                屏幕坐标x
     * @param y                屏幕坐标y
     * @param width            屏幕渲染长度
     * @param height           屏幕渲染宽度
     */
    public static void drawTexture(MatrixStack matrices, TextureElement element, float x, float y, float width, float height, float widthPercentage, float heightPercentage) {
        drawTexture(matrices, element, x, x + width, y, y + height, 0, widthPercentage, heightPercentage);
    }

    /**
     * 通过element获得图片并渲染在屏幕的(x0,y0,z)到(x1,y1,z)位置
     * <p>注意(x0,y0,z)为图片左上端点的位置,(x1,y1,z)为图片右下端点的位置
     * <p>渲染长度为width
     * <p>渲染宽度为height
     *
     * @param matrices         用于渲染的矩阵堆栈
     * @param element          用于渲染的图片和图片相对位置信息
     * @param widthPercentage  图片水平渲染百分比
     * @param heightPercentage 图片垂直渲染百分比
     * @param x0               屏幕坐标x0
     * @param y0               屏幕坐标y0
     * @param x1               屏幕坐标x1
     * @param y1               屏幕坐标y1
     * @param z                屏幕坐标z
     */
    public static void drawTexture(MatrixStack matrices, TextureElement element, float x0, float x1, float y0, float y1, float z, float widthPercentage, float heightPercentage) {
        drawTexturedQuad(matrices.peek().getModel(), element, x0, x1, y0, y1, z, element.U0(), element.U1(widthPercentage), element.V0(), element.V1(heightPercentage));
    }

    public static void drawTexturedQuad(Matrix4f matrices, TextureElement element, float x0, float x1, float y0, float y1, float z, float u0, float u1, float v0, float v1) {
        BufferBuilder bufferBuilder = Tessellator.getInstance().getBuffer();
        bufferBuilder.begin(7, VertexFormats.POSITION_COLOR_TEXTURE);
        bufferBuilder.vertex(matrices, x0, y1, z).color(element.getRed(), element.getGreen(), element.getBlue(), element.getAlpha()).texture(u0, v1).next();
        bufferBuilder.vertex(matrices, x1, y1, z).color(element.getRed(), element.getGreen(), element.getBlue(), element.getAlpha()).texture(u1, v1).next();
        bufferBuilder.vertex(matrices, x1, y0, z).color(element.getRed(), element.getGreen(), element.getBlue(), element.getAlpha()).texture(u1, v0).next();
        bufferBuilder.vertex(matrices, x0, y0, z).color(element.getRed(), element.getGreen(), element.getBlue(), element.getAlpha()).texture(u0, v0).next();
        bufferBuilder.end();
        RenderSystem.enableAlphaTest();
        BufferRenderer.draw(bufferBuilder);
    }
}
